﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using vudu.Logica.Clases;
using vudu.ClasesDominio;

namespace vudu.Datos.SqlServer
{
    public class SqlServerPractica
    {

        public Escuela ArmarEscuela(string correo)
        {
            Escuela retorno = new Escuela();
            SqlDataReader reader = null;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEscuelaP]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@correo", correo);

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    retorno.IdEscuela = reader.GetInt32(0);
                    retorno.NombreEscuela = reader.GetString(2);
                    retorno.TelefonoEscuela = reader.GetString(4);
                    retorno.DirectorEscuela = reader.GetString(5);
                    retorno.DireccionEscuela = reader.GetString(6);
                }

            }
            catch (SqlException e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno =  null;
            }

            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno =  null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<HorarioDeClase> ConsultarHorasPracticas(int idpractica)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<HorarioDeClase> retorno = new List<HorarioDeClase>();
            try
            {
                List<HorarioDeClase> listahorario = new List<HorarioDeClase>();
                //se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarHorasPractica]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idpractica", idpractica);
                command.Parameters["@idpractica"].Direction = ParameterDirection.Input;
                //se carga la informacion desde la base de datos
                reader = command.ExecuteReader();

                Salon salonDeClase = new Salon();
                while (reader.Read())
                {
                    HorarioDeClase horario = new HorarioDeClase();
                    horario.Dia = reader.GetString(0);
                    horario.HoraInicio = reader.GetDateTime(1);
                    horario.HoraFin = reader.GetDateTime(2);
                    salonDeClase.Nombre = reader.GetString(3);
                    salonDeClase.Tipo = reader.GetString(4);
                    horario.SalonDeClase = salonDeClase;
                    listahorario.Add(horario);

                }

                retorno = listahorario;

            }
            catch (SqlException e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<Profesor> ConsultarProfesor(int idEscuela)
        {
            Conexion miConexion = new Conexion();
            List<Profesor> lista = new List<Profesor>();
            List<Profesor> retorno = new List<Profesor>();
            //int idEscuela = 1;
            SqlCommand command = new SqlCommand();
            miConexion.AbrirConexionBd();
            command.Connection = miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[dbo].[ConsultarProfesorP]";
            command.CommandTimeout = 10;
            command.Parameters.AddWithValue("@escuela", idEscuela);
            //variables del stored procedure de sql server.
            //command.Parameters.AddWithValue("@idEscuela", idEscuela);
            //command.Parameters["@idEscuela"].Direction = ParameterDirection.Input;
            try
            {

                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Profesor Profesor = new Profesor();
                    Profesor.Crn = reader.GetInt32(0);
                    Profesor.Nombre = reader.GetString(1);
                    Profesor.Apellido = reader.GetString(2);
                    Profesor.Cedula = reader.GetInt32(3);
                    lista.Add(Profesor);

                }
                reader.Close();

                retorno = lista;
            }
            catch (SqlException e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public int UltimoIdPractica()
        {

            Conexion miConexion = new Conexion();
            int id_Practica = 1;
            int retorno = 0;
            //int idEscuela = 1;
            SqlCommand command = new SqlCommand();
            miConexion.AbrirConexionBd();
            command.Connection = miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[dbo].[UltimoIdPractica]";
            command.CommandTimeout = 10;
            //variables del stored procedure de sql server.
            try
            {
                SqlDataReader reader = command.ExecuteReader();
                if (reader.HasRows == false)
                {
                    return id_Practica;
                }
                else
                {

                    while (reader.Read())
                    {
                        int id_practiultimo = 0;
                        id_practiultimo = reader.GetInt32(0);
                        id_Practica = id_practiultimo;
                    }


                    retorno = id_Practica;
                }
            }
            catch (SqlException e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = 0;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = 0;
            }
            return retorno;
        }

        public bool AgregarPractica(Practica practica, int idSeccionMateria)
        {
            bool retorno = false;
            try
            {
                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();//[dbo].[AgregarPractica]
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[AgregarPractica]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@IdPractica", practica.IdPractica);
                command.Parameters["@IdPractica"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@NumeroSeccion", practica.NumeroSeccion);
                command.Parameters["@NumeroSeccion"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@NombrePractica", practica.NombrePractica);
                command.Parameters["@NombrePractica"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@idSeccionMateria", idSeccionMateria);
                command.Parameters["@idSeccionMateria"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@statusPractica", practica.statusPractica);
                command.Parameters["@statusPractica"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@Cedula", practica.profesor.Crn);
                command.Parameters["@Cedula"].Direction = ParameterDirection.Input;
                command.ExecuteReader();

                retorno = true;
            }
            catch (SqlException e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno =  false;
            }

            return retorno;
        }

        public bool AgregarHorarioClase(HorarioDeClase horarioDeClase, int idPractica)
        {
            bool retorno = false;
            try
            {
                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();//[dbo].[AgregarPractica]
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[AgregarHorarioClasePractica]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.

                command.Parameters.AddWithValue("@Dia", horarioDeClase.Dia);
                command.Parameters["@Dia"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@HoraInicio", horarioDeClase.HoraInicio);
                command.Parameters["@HoraInicio"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@HoraFin", horarioDeClase.HoraFin);
                command.Parameters["@HoraFin"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@NumeroSalon", horarioDeClase.SalonDeClase.NumeroSalon);
                command.Parameters["@NumeroSalon"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@idPractica", idPractica);
                command.Parameters["@idPractica"].Direction = ParameterDirection.Input;
                command.ExecuteReader();
                
                retorno = true;
            }
            catch (SqlException e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            return retorno;
        }

        public List<SeccionMateria> ConsultarSeccionMateria(int idEscuela, int idMateria)
        {
            Conexion miConexion = new Conexion();
            List<SeccionMateria> lista = new List<SeccionMateria>();
            List<SeccionMateria> retorno = new List<SeccionMateria>();
            SqlCommand command = new SqlCommand();
            miConexion.AbrirConexionBd();
            command.Connection = miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[dbo].[ConsultaSeccionMateriaP]";
            command.CommandTimeout = 10;
            command.Parameters.AddWithValue("@escuela", idEscuela);
            command.Parameters.AddWithValue("@materia", idMateria);
            try
            {

                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccion = new SeccionMateria();
                    seccion.IdSeccionMateria = reader.GetInt32(1);
                    seccion.Codigo = reader.GetInt32(0);
                    Profesor miProf = new Profesor();
                    miProf.Crn = reader.GetInt32(2);

                    seccion.Profesor = miProf;
                    lista.Add(seccion);

                }
                reader.Close();

                // LLENO LOS HORARIOS DE LAS SECCIONESMATERIAS CON SUS PRACTICAS Y SUS HORARIOS
                for (int contador = 0; contador < lista.Count(); contador++)
                {
                    lista[contador].HorasClase = BuscarListaHorariosClaseMateria(lista[contador].IdSeccionMateria);
                    lista[contador].ListaPractica = ConsultarNombrePractica(lista[contador].IdSeccionMateria);
                    if (lista[contador].ListaPractica != null)
                        for (int contador1 = 0; contador1 < lista[contador].ListaPractica.Count(); contador1++)
                        {
                            lista[contador].ListaPractica[contador1].horarioDeClase = BuscarListaHorariosClasePractica(lista[contador].ListaPractica[contador1].IdPractica);
                        }

                }

                retorno = lista;
            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<Practica> ConsultarNombrePractica(int idSeccionMateria)
        {
            List<Practica> retorno = new List<Practica>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            miConexion.AbrirConexionBd();
            command.Connection = miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[DBO].[ConsultarNombrePractica]";
            command.CommandTimeout = 10;
            //variables del stored procedure de sql server.
            command.Parameters.AddWithValue("@idSeccionMateria", idSeccionMateria);
            command.Parameters["@idSeccionMateria"].Direction = ParameterDirection.Input;
            try
            {
                List<Practica> listaPractica = new List<Practica>();
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Profesor miProfesor = new Profesor();
                    Practica practica = new Practica();
                    practica.IdPractica = reader.GetInt32(0);
                    practica.NombrePractica = reader.GetString(1);
                    practica.NumeroSeccion = reader.GetInt32(2);
                    practica.statusPractica = reader.GetString(3);
                    miProfesor.Crn = reader.GetInt32(4);
                    practica.profesor = miProfesor;
                    listaPractica.Add(practica);

                }
                reader.Close();

                // LLENO LOS HORARIOS DE CADA PRACTICA
                for (int contador = 0; contador < listaPractica.Count; contador++)
                {

                    List<HorarioDeClase> listaHorarios = new List<HorarioDeClase>();
                    listaHorarios = BuscarListaHorariosClasePractica(listaPractica[contador].IdPractica);
                    listaPractica[contador].horarioDeClase = listaHorarios;

                    // LLENO EL PROFESOR, COMO YA SE HABIA CREADO UNO CON SOLO EL CRN, LO MANDO PARA QUE ME RETORNE LLENO Y SUSTITUYO
                    listaPractica[contador].profesor = BuscarProfesor(listaPractica[contador].profesor.Crn);

                }

                retorno = listaPractica;
            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public bool EliminarPractica(int idPractica)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            bool retorno = false;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[EliminarPractica]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idPractica", idPractica);
                command.Parameters["@idPractica"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                command.ExecuteReader();
                retorno = true;
            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<Materia> MateriasDisponibles(string nombreEscuela)
        {

            /**
             * Esta funcion me retorna una lista de Prelacion dado el nombre de la escuela, esto quiere decir que, la
             * lista que se retorna viene filtrado por el pensum que se encuentre activo en este momento, cada Prelacion
             * contiene una materia base y una lista de materias que prelan la materia base, esta funcion es utilizada
             * para ser filtrada posteriormente a tal punto que solo quedan las materias que puede ver el estudiante
             * a la hora de crear una Pre Matricula nueva.
             **/

            List<Materia> retorno = new List<Materia>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            int idEscuela = 0;
            int idPensum = 0;

            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT id_Escuela FROM ESCUELA WHERE nombre =  '" + nombreEscuela + "'";
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    idEscuela = reader.GetInt32(0);
                }

                idPensum = BuscarPensum(idEscuela);
                retorno = CrearListaPrelacion(idPensum);

            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public int BuscarPensum(int idEscuela)
        {

            /**
             * Esta funcion se encarga de buscar y retornar el id del pensum que se encuentre activado dado el id de
             * la escuela. Esto nos servira para buscar las materias que se encuentren activadas para el pensum actual.
             **/

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            //Pensum retorno = new Pensum();
            int idPensum = 0;
            int retorno = 0;
            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT id_Pensum FROM Pensum WHERE fk_id_escuela = " + idEscuela + " AND statusPensum = 'ACTIVADO'";
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    idPensum = reader.GetInt32(0);
                }

                retorno = idPensum;

            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = 0;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = 0;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<Materia> CrearListaPrelacion(int idPensum)
        {

            /*
             * Esta funcion se encarga de buscar y retornar una lista de Prelaciones dado el id de Pensum que se recibe
             * por parametro, aqui se crean las distintas Prelaciones y se llenan con la informacion que estas poseen
             * pero no llenan la lista de materias que prelan a la materia ni la informacion de la materia base, esto se
             * hace con unas llamadas a procedimientos que se explican mas abajo. Se implementa el uso de una lista de
             * enteros que guarda el id de las materias, luego se va recorriendo uno a uno la lista de retorno y la lista
             * que contiene los ids de las materias, ambas lista se corresponden 1 a 1 por la posicion, por lo que en cada
             * ciclo de recorrido de la lista toma el id de la materia, manda a buscarla, se retorna un objeto de MAteria
             * con toda la informacion de la materia base y se asigna a la Prelacion, lo mismo ocurre con la lista de las
             * prelaciones, s emanda a buscar la lista de materias que prelan la materia base mandando el id del pensum
             * vigente y el id de la lista de id materias para posteriormente asignarla a la lista de materias prela de
             * la prelacion.
             */

            List<Materia> retorno = new List<Materia>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<int> listaMaterias = new List<int>();


            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                //command.CommandText = "SELECT semestre, numCreditos, fk_id_materia FROM PensumMateria WHERE fk_id_pensum =" + idPensum + " ORDER BY fk_id_materia ASC";
                command.CommandText = "SELECT M.nombreMateria, M.id_Materia FROM Pensum P,PensumMateria PM, SeccionMateria S, Materia M " +
                                        "WHERE P.id_Pensum = " + idPensum + " AND P.fechaFin is null AND P.id_Pensum = PM.fk_id_pensum " +
                                        "AND M.horasPractica > 0 AND PM.fk_id_materia =S.fk_Materia AND S.fk_Materia = M.id_Materia GROUP BY M.nombreMateria, M.id_Materia " +
                                        "ORDER BY M.id_Materia";
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                { listaMaterias.Add(reader.GetInt32(1)); }

                for (int contador = 0; contador < listaMaterias.Count; contador++)
                {
                    Materia miMateria = new Materia();
                    miMateria = BuscarMateria(listaMaterias[contador]);
                    retorno.Add(miMateria);

                }


            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public bool Existe(int id, List<int> prelaciones)
        {

            /** 
             * Este procedimiento recibe un id y una lista de enteros, aqui se comprueba la presencia del id en la lista
             * si esto ocurre, se retorna true, de lo contrario se retorna false. Esto se aplica para evitar la duplicacion
             * de objetos en una lista.
             **/

            bool retorno = false;

            foreach (int miPrelacion in prelaciones)
            {

                if (miPrelacion == id)
                    retorno = true;

            }

            return retorno;
        }

        public Materia BuscarMateria(int idMateria)
        {
            //Dado el id de la materia se busca en la base de datos y se obtienen los datos de la misma
            //para poder guardarlos en los objetos.
            Materia retorno = new Materia();
            SqlDataReader reader = null;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nombreMateria as nombre, horasPractica FROM Materia WHERE id_Materia = " + idMateria;
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    retorno.Nombre = reader["nombre"].ToString();
                    retorno.HorasPractica = reader.GetInt32(1);
                    retorno.Codigo = idMateria;
                }


            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<HorarioDeClase> BuscarListaHorariosClasePractica(int idPractica)
        {
            //Cada SeccionMateria posee una lista de horarios el cual se obtienene con el idSeccionMateria,
            //esta lista es reccorrida de la misma manera que en funciones anteriores usando un While y guardando
            //la lista de enteros y luego un for recorriendo la lista.
            //En este procedeimiento se verifica si la seccionMateria se trata de una practica o de una materia,
            //en este caso es una PRACTICA
            List<HorarioDeClase> retorno = new List<HorarioDeClase>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader1 = null;

            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT  diaSemana,horaInicio as horaIni,horaFin as horaFin, fk_Salon, id_Horario FROM HorarioClase WHERE fk_SeccionPractica = " + idPractica + " AND fk_SeccionMateria is NULL"; command.CommandTimeout = 10;
                List<int> idSalones = new List<int>();

                reader1 = command.ExecuteReader();

                while (reader1.Read())
                {

                    HorarioDeClase horario = new HorarioDeClase();

                    horario.Dia = reader1["diaSemana"].ToString();
                    horario.HoraInicio = reader1.GetDateTime(1);
                    horario.HoraFin = reader1.GetDateTime(2);
                    idSalones.Add(reader1.GetInt32(3));
                    horario.IdHorarioClase = reader1.GetInt32(4);

                    retorno.Add(horario);
                }

                // LLENO LOS SALONES DEL HORARIO
                for (int contador = 0; contador < idSalones.Count; contador++)
                {
                    retorno[contador].SalonDeClase = BuscarSalon(idSalones[contador]);
                }


            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader1 != null)
                    reader1.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public Profesor BuscarProfesor(int idProfesor)
        {
            //Dado el id del profesor se busca en la base de datos y se obtienen los datos del mismo
            //para poder guardarlos en los objetos.
            Profesor retorno = new Profesor();
            SqlDataReader reader = null;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nombreProfesor as nombre,apellidoProfesor as apellido FROM Profesor WHERE id_Profesor = " + idProfesor;
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    retorno.Nombre = reader["nombre"].ToString();
                    retorno.Apellido = reader["apellido"].ToString();
                    retorno.Crn = idProfesor;
                }


            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }
        
        public List<HorarioDeClase> BuscarListaHorariosClaseMateria(int idSeccionMateria)
        {
            //Cada SeccionMateria posee una lista de horarios el cual se obtienene con el idSeccionMateria,
            //esta lista es reccorrida de la misma manera que en funciones anteriores usando un While y guardando
            //la lista de enteros y luego un for recorriendo la lista.
            //En este procedeimiento se verifica si la seccionMateria se trata de una practica o de una materia,
            //en este caso es una MATERIA
            List<HorarioDeClase> retorno = new List<HorarioDeClase>();
            SqlDataReader reader = null;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT  diaSemana, horaInicio as horaIni,horaFin as horaFin, fk_Salon, id_Horario FROM HorarioClase WHERE fk_SeccionMateria = " + idSeccionMateria + " AND fk_SeccionPractica is NULL";
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                List<int> idSalones = new List<int>();

                while (reader.Read())
                {

                    HorarioDeClase horario = new HorarioDeClase();

                    horario.Dia = reader["diaSemana"].ToString();
                    horario.HoraInicio = reader.GetDateTime(1);
                    horario.HoraFin = reader.GetDateTime(2);
                    idSalones.Add(reader.GetInt32(3));
                    horario.IdHorarioClase = reader.GetInt32(4);

                    retorno.Add(horario);
                }

                for (int contador = 0; contador < idSalones.Count; contador++)
                {
                    retorno[contador].SalonDeClase = BuscarSalon(idSalones[contador]);
                }


            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;

        }

        public Practica BuscarPractica(int idPractica)
        {
            //Dado el id de la practica se busca en la base de datos y se obtienen los datos de la misma
            //para poder guardarlos en los objetos.
            Practica retorno = new Practica();

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;

            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT numeroSeccion, nombrePractica, fk_Profesor FROM Practica WHERE id_Practica = " + idPractica;
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                int idProfesor = 0;

                while (reader.Read())
                {
                    retorno.NumeroSeccion = reader.GetInt32(0);
                    retorno.NombrePractica = reader["nombrePractica"].ToString();
                    idProfesor = reader.GetInt32(2);

                }

                retorno.IdPractica = idPractica;
                retorno.horarioDeClase = BuscarListaHorariosClasePractica(idPractica);
                if (idProfesor != 0)
                {

                    retorno.profesor = BuscarProfesor(idProfesor);

                }


            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public Salon BuscarSalon(int idSalon)
        {
            //Dado el id del salon se busca en la base de datos y se obtienen los datos del mismo
            //para poder guardarlos en los objetos.
            Salon retorno = new Salon();
            SqlDataReader reader = null;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nombre FROM Salon WHERE id_salon = " + idSalon;
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    retorno.NumeroSalon = idSalon;
                    retorno.Nombre = reader.GetString(0);
                }

            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public bool ModificarProfesor(int idProfesor, int idPractica)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            bool retorno = false;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ModificarProfesorPractica]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idProfesor", idProfesor);
                command.Parameters["@idProfesor"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@idPractica", idPractica);
                command.Parameters["@idPractica"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                command.ExecuteReader();
                retorno = true;
            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public bool ModificarSalon(int idPractica, int idHorario, int salon)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            bool retorno = false;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ModificarSalonPractica]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idsalon", salon);
                command.Parameters["@idsalon"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@idPractica", idPractica);
                command.Parameters["@idPractica"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@idHorario", idHorario);
                command.Parameters["@idHorario"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                command.ExecuteReader();
                retorno = true;
            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public bool ModificarHorarioPractica(DateTime horaInicio, DateTime horaFin, string dia, int idPractica, int idSalon)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            bool retorno = false;
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ModificarHorarioPractica]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idPractica", idPractica);
                command.Parameters["@idPractica"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@horaInicio", horaInicio);
                command.Parameters["@horaInicio"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@horaFin", horaFin);
                command.Parameters["@horaFin"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@dia", dia);
                command.Parameters["@dia"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@salon", idSalon);
                command.Parameters["@salon"].Direction = ParameterDirection.Input;


                //se ejecuta el comando
                command.ExecuteReader();
                retorno = true;
            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<Materia> ConsultarListaMateriasPractica(string nombreEscuela)
        {
            List<Materia> retorno = new List<Materia>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            int idEscuela = 0;
            int idPensum = 0;

            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT id_Escuela FROM ESCUELA WHERE nombre =  '" + nombreEscuela + "'";
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    idEscuela = reader.GetInt32(0);
                }

                idPensum = BuscarPensum(idEscuela);
                retorno = CrearListaSalones(idPensum);

            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

        public List<Materia> CrearListaSalones(int idPensum)
        {

            /*
             * Esta funcion se encarga de buscar y retornar una lista de Prelaciones dado el id de Pensum que se recibe
             * por parametro, aqui se crean las distintas Prelaciones y se llenan con la informacion que estas poseen
             * pero no llenan la lista de materias que prelan a la materia ni la informacion de la materia base, esto se
             * hace con unas llamadas a procedimientos que se explican mas abajo. Se implementa el uso de una lista de
             * enteros que guarda el id de las materias, luego se va recorriendo uno a uno la lista de retorno y la lista
             * que contiene los ids de las materias, ambas lista se corresponden 1 a 1 por la posicion, por lo que en cada
             * ciclo de recorrido de la lista toma el id de la materia, manda a buscarla, se retorna un objeto de MAteria
             * con toda la informacion de la materia base y se asigna a la Prelacion, lo mismo ocurre con la lista de las
             * prelaciones, s emanda a buscar la lista de materias que prelan la materia base mandando el id del pensum
             * vigente y el id de la lista de id materias para posteriormente asignarla a la lista de materias prela de
             * la prelacion.
             */

            List<Materia> retorno = new List<Materia>();
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<int> listaMaterias = new List<int>();


            try
            {

                //Se abre la conexion a base de datos
                miConexion.AbrirConexionBd();

                //Se introducen los datos de la conexion
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                //command.CommandText = "SELECT semestre, numCreditos, fk_id_materia FROM PensumMateria WHERE fk_id_pensum =" + idPensum + " ORDER BY fk_id_materia ASC";
                command.CommandText = "SELECT M.nombreMateria, M.id_Materia FROM Pensum P,PensumMateria PM, SeccionMateria S, Materia M, Practica T "+
                                      "WHERE P.id_Pensum = "+ idPensum +" AND P.fechaFin is null AND P.id_Pensum = PM.fk_id_pensum AND PM.fk_id_materia = "+
                                      "S.fk_Materia AND S.fk_Materia = M.id_Materia AND M.horasPractica > 0 AND T.fk_SeccionMAteria = S.id_Seccion " +
                                      "AND T.statusPractica = 'Activo'  GROUP BY " + "M.nombreMateria, M.id_Materia ORDER BY M.id_Materia";
                command.CommandTimeout = 10;

                reader = command.ExecuteReader();

                while (reader.Read())
                { listaMaterias.Add(reader.GetInt32(1)); }

                for (int contador = 0; contador < listaMaterias.Count; contador++)
                {
                    Materia miMateria = new Materia();
                    miMateria = BuscarMateria(listaMaterias[contador]);
                    retorno.Add(miMateria);

                }


            }
            catch (SqlException exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }
            catch (Exception exc)
            {
                System.Console.WriteLine(exc.StackTrace);
                System.Console.ReadLine();
                retorno = null;
            }

            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
            return retorno;
        }

    }
}